package com.igeek.boot.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestAttribute;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author fengqq
 * @Description 参数注解--请求转发传递数据
 * @Date 2024/8/16  9:40
 *
 * 面试题：请求转发和重定向的区别
 * 1.请求转发： "forward:index.html"  ==> request.getRequestDispatcher(path).forward(request,response);
 *   响应重定向 "redirect:index.html" ==> response.sendRedirect(path)
 *
 * 2.请求转发,不会产生新的请求，继续携带请求中的数据
 *   响应重定向，会产生新的请求，不携带请求中的数据
 * 3.请求转发。地址栏不会发生变化，显示的还是最开始的请求地址 --> 重复刷新地址栏会再次发起请求 ，建议执行查询操作
 *   响应重定向，地址栏会发生变化，显示的还是最终的请求地址 --> 避免重复提交的表单，建议执行增删改操作
 * 4.请求转发，本项目的服务器内部权力的转移 只能请求到本项目内的地址
 *   响应重定向，重定向到任何项目的地址
 */
@Controller
public class ForwardController {

    //发送请求数据
    @GetMapping("/sendForwardData")
    public String sendForwardData(
            HttpServletRequest request,
            Model model,
            ModelMap modelMap){
        request.setAttribute("request-a","aaa");
        model.addAttribute("model-b","bbb");
        modelMap.addAttribute("modelMap-c","ccc");
        return "forward:/reviceForwardData";
    }
    //接收请求数据
    @GetMapping("/reviceForwardData")
    @ResponseBody
    public Map<String,Object> reviceForwardData(
            @RequestAttribute("request-a") String a,
            @RequestAttribute("model-b") String b,
            @RequestAttribute("modelMap-c") String c,
            HttpServletRequest request
    ){
        Object a2 = request.getAttribute("request-a");
        HashMap<String, Object> map = new HashMap<>();
        map.put("a",a);
        map.put("b",b);
        map.put("c",c);
        map.put("a2",a2);
        return map;
    }
}
